home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
searchtools
/
look.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
3KB
|
185 lines
static char *sccsid = "@(#)look.c 4.2.olson (From UC Berkeley) 13 Nov. 83";
/* altered to allow multiple files for lookup. fortune!olson */
#include <stdio.h>
#include <ctype.h>
FILE *dfile;
/* default dictionary (/usr/dict for v7 or bsd) */
#define DICT "/usr/lib/dict/words"
int fold;
int dict;
int tab;
char entry[250];
char word[250];
char key[50];
char *search;
long top,bot,mid;
main(argc,argv)
char **argv;
{
while(argc>=2 && *argv[1]=='-') {
for(;;) {
switch(*++argv[1]) {
case 'd':
dict++;
continue;
case 'f':
fold++;
continue;
case 't':
tab = argv[1][1];
if(tab)
++argv[1];
continue;
case 0:
break;
default:
continue;
}
break;
}
argc --;
argv++;
}
if(argc<=1) {
fprintf(stderr, "Usage: %s [-f(old)] [-d(ict only)] [-t(abchar) c] word [sortedfile ...]\n",
argv[0]);
return 1;
}
search = argv[1];
if(argc==2) {
fold++;
dict++;
lookup(DICT);
}
else {
register i;
for(i=2;argv[i];i++)
lookup(argv[i]);
}
exit(0);
}
lookup(filenam)
char *filenam;
{
register c;
if(dfile)
fclose(dfile);
dfile = fopen(filenam,"r");
if(dfile==NULL) {
fprintf(stderr,"look: can't open %s\n",filenam);
return(2);
}
canon(search,key);
bot = 0;
fseek(dfile,0L,2);
top = ftell(dfile);
for(;;) {
mid = (top+bot)/2;
fseek(dfile,mid,0);
do {
c = getc(dfile);
mid++;
} while(c!=EOF && c!='\n');
if(!getword(entry))
break;
canon(entry,word);
switch(compare(key,word)) {
case -2:
case -1:
case 0:
if(top<=mid)
break;
top = mid;
continue;
case 1:
case 2:
bot = mid;
continue;
}
break;
}
fseek(dfile,bot,0);
while(ftell(dfile)<top) {
if(!getword(entry))
return;
canon(entry,word);
switch(compare(key,word)) {
case -2:
return;
case -1:
case 0:
puts(entry);
break;
case 1:
case 2:
continue;
}
break;
}
while(getword(entry)) {
canon(entry,word);
switch(compare(key,word)) {
case -1:
case 0:
puts(entry);
continue;
}
break;
}
}
compare(s,t)
register char *s,*t;
{
for(;*s==*t;s++,t++)
if(*s==0)
return(0);
return(*s==0? -1:
*t==0? 1:
*s<*t? -2:
2);
}
getword(w)
char *w;
{
register c;
for(;;) {
c = getc(dfile);
if(c==EOF)
return(0);
if(c=='\n')
break;
*w++ = c;
}
*w = 0;
return(1);
}
canon(old,new)
char *old,*new;
{
register c;
for(;;) {
*new = c = *old++;
if(c==0||c==tab) {
*new = 0;
break;
}
if(dict && !isalnum(c))
continue;
if(fold && isupper(c))
*new = tolower(c);
new++;
}
}